#include<bits/stdc++.h>
#define int long long
using namespace std; 
int n,m,p,q,mod=147744151;
int x_1,x_2,y_1,y_2,a[1005][1005];
int b[1005][1005];
int ans;

char buf[(1<<21)+5],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}

bool ch(int x){
	for(int i=2;i*i<=x;i++){
		if(x%i==0) return false;
	}
	return true;
}
int r(int x,int y){
	x%=p;
	int z=1;
	while(y){
		if(y&1) z=z*x%p;
		x=x*x%p;
		y>>=1;
	}
	return z;
}
signed main(){
	freopen("tsuki.in","r",stdin);
	freopen("tsuki.out","w",stdout);
	n=read();m=read();p=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=read();
			b[i][j]=a[i][j];
		}
	}
	q=read();
	if(n<=200&&m<=200){
		for(int x=1;x<=q;x++){
			x_1=read();y_1=read();x_2=read();y_2=read();
			int res=1;
			for(int i=x_1;i<=x_2;i++){
				for(int j=y_1;j<=y_2;j++){
					res=(res*a[i][j])%p;
				}
			}
			ans+=(res^x);
			ans%=mod;
		}
		printf("%lld",ans);
		return 0;
	}
	else{
		for(int i=1;i<=n;i++){
			for(int j=2;j<=m;j++){
				b[i][j]*=b[i][j-1];
				b[i][j]%=p;
			}
		}
		for(int i=2;i<=n;i++){
			for(int j=1;j<=m;j++){
				b[i][j]*=b[i-1][j];
				b[i][j]%=p;
			}
		}
		for(int i=0;i<=n;i++) b[i][0]=1;
		for(int i=0;i<=m;i++) b[0][i]=1;
		for(int x=1;x<=q;x++){
			x_1=read();y_1=read();x_2=read();y_2=read();
			int res=b[x_2][y_2]*r(b[x_1-1][y_2],p-2)%p*r(b[x_2][y_1-1],p-2)%p*b[x_1-1][y_1-1]%p;
			ans+=(res^x);
			ans%=mod;
		}
		printf("%lld",ans);
	}
	return 0;
}
